#include "Gui.h"
#include "VentanaPropiedades.h"
#include "Modelo.h"
#include "TorrentInfo.h"
#include "Torrent.h"
#include <iostream>
using namespace std;

Gui::Gui(int argc, char* argv[], Modelo* modelo):
	loopEventos(argc,argv)
{

	// necesitamos una referencia al modelo
	this->modelo = modelo;

	// creamos un modelo de lista, el cual contiene información sobre los torrents
	this->modeloTorrents = ListStore::create(this->columnas);

	this->ventana = new VentanaPrincipal(this);

	// creamos un timeout. La funciín actualizar se va a llamar desde el thread de Gtk cada 1000 milisegundos
	sigc::connection con = Glib::signal_timeout().connect(sigc::mem_fun(*this, &Gui::actualizar), 1000);

	ventana->show_all_children();
}

Gui::~Gui() {
	map<string, TorrentGui*>::const_iterator it;
	for(it = this->torrents.begin(); it != this->torrents.end(); it++) {
		delete it->second;
	}
	delete ventana;
}

void* Gui::run() {
	// empieza el loop de eventos de Gtk
	this->loopEventos.run(*this->ventana);
	return NULL;
}

void Gui::empezar() {
	ventana->escribir("empezar"); // TODO remover
	if (getFilaSeleccionada()) {
		TreeModel::Row fila = *getFilaSeleccionada();
		fila[columnas.estado] = "conectando...";
	}
}

void Gui::pausar() {

	ventana->escribir("pausa"); // TODO remover
	if (getFilaSeleccionada()) {
		TreeModel::Row fila = *getFilaSeleccionada();
		if (fila[columnas.estado] == "bajando") {
			fila[columnas.estado] = "pausado";
		} else if (fila[columnas.estado] == "pausado") {
			fila[columnas.estado] = "conectando...";
		}
	}
}

void Gui::agregar() {
	ventana->escribir("agregar"); // TODO remover

	// creamos un dialog que permite seleccionar un archivo
	FileChooserDialog dialog("Por favor, seleccione un .torrent",FILE_CHOOSER_ACTION_OPEN);
	dialog.add_button(Stock::CANCEL, RESPONSE_CANCEL);
	dialog.add_button(Stock::OK, RESPONSE_OK);

	// solo permitimos que el uluario deleccione un .torrent
	FileFilter filtro;
	filtro.set_name("Archivos Torrent");
	filtro.add_pattern("*.torrent");
	dialog.add_filter(filtro);

	// abrimos el dialog
	int resultado = dialog.run();

	// si el usuario selecciono un torrent con exito
	if (resultado == RESPONSE_OK) {
		Glib::ustring ruta = dialog.get_filename();
		ventana->escribir(ruta); // TODO remover
		modelo->agregarTorrent(ruta);
		this->agregarTorrent("45"); // TODO remover
	}
}

void Gui::remover() {
	ventana->escribir("remover"); // TODO remover
	TreeModel::Row fila = *getFilaSeleccionada();
	if (getFilaSeleccionada()) {
		Glib::ustring id = fila[this->columnas.id];
		delete this->torrents[id];
		this->torrents.erase(id);
		modeloTorrents->erase(getFilaSeleccionada());
		this->modelo->removerTorrent(id);
	}
}

TorrentGui* Gui::agregarTorrent(Glib::ustring id) {

	TreeModel::Row fila = *(modeloTorrents->append());
	fila[this->columnas.id] = id;

	this->torrents[id] = new TorrentGui(fila, this);
	return this->torrents[id];
}

TreeModel::iterator Gui::getFilaSeleccionada() {
	Glib::RefPtr<TreeSelection> seleccion = ventana->getSeleccionado();
	TreeModel::iterator iter = seleccion->get_selected();
	return iter;
}

void Gui::verPropiedades() {

	if (getFilaSeleccionada()) {
		TreeModel::Row fila = *getFilaSeleccionada();
		Glib::ustring id = fila[columnas.id];
		getTorrent(id)->mostrarVentana();
	}
}

TorrentGui* Gui::getTorrent(const string& id) {
	TorrentGui* retorno = this->torrents[id];
	return retorno;
}

void Gui::cantMaxPeers(const string& idTorrent, int maxCantPeers) {

}

void Gui::stop() {
	// TODO implementar thread stop
	Thread::stop();
}

bool Gui::actualizar() {

	// TODO remover
	static int i = 0;

	i++;
	char numero[10];
	sprintf(numero,"%d",i);

	this->ventana->escribir(numero);

	if (i == 10) {
		return false;
	}

//	list<Torrent*>* listaTorrents = modelo->getListaTorrents();
//	list<Torrent*>::iterator itModelo;
//
//	for (itModelo = listaTorrents->begin(); itModelo != listaTorrents->end(); itModelo++) {
//
//		TorrentInfo* info = (*itModelo)->getTorrentInfo();
//		string id = (*itModelo)->getId();
//		TorrentGui* torrentGui = this->getTorrent(id);
//
//		// Si existe en la vista
//		if (torrentGui) {
//			torrentGui->setBajado((*itModelo)->getBajado());
//		} else {
//			torrentGui = this->agregarTorrent(id);
//			torrentGui->setNombre(info->getNombre());
//		}
//
//	}
	return true;
}
